package com.dongdongshop.shiro;

import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;


@Configuration    // 声明是一个配置类
public class ShiroConfig {

    // 将 shiro 的过滤链放入spring容器中
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Autowired DefaultWebSecurityManager defaultWebSecurityManager){

        // 创建过滤器链工厂类
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        /**
         *  常用的 种 过滤器
         *  anon : 不需要登录就可以访问
         *  authc : 必须登录才能访问
         *  perms : 登录之后有权限才能访问   会自动进入授权方法
         *  role : 登录之后有角色才能访问
         *  logout : 退出登录 过滤去
         */

        // 添加 shiro 内置的过滤器
        // LinkedHashMap 保证了存取有序
        Map<String,String> filerMap = new LinkedHashMap<>();
            // map的 key 使我们的 url ,value 就是我们设置的 url 所对应的过滤器
//        filerMap.put("/index","anon");
//        filerMap.put("/user/select","anon");
//        filerMap.put("/user/update","anon");
//        filerMap.put("/login","anon");


        // perms 表示拥有相关权限 才能删除     perms 里面为一个数组
        //filerMap.put("/user/delete","perms[user_delete]");  // permission: 权限   Auth: 认证相关
        //filerMap.put("/user/add","perms[user_add]");  // permission: 权限   Auth: 认证相关

        // 退出登录   调用 /logout 即可
        filerMap.put("/logout","logout");



//        filerMap.put("/**","authc");

        // map是怎么遍历的? 通过keySet 获取所有的key    Set : 无序集合
        // Set<String> set = filerMap.keySet();

        // shiro 默认的登录页面 Login.jsp ,  SpringBoot 不支持
//        factoryBean.setLoginUrl("/toLogin");
//        factoryBean.setUnauthorizedUrl("/unauthorized");



        // 设置安全管理器  DI      依赖注入
        factoryBean.setSecurityManager(defaultWebSecurityManager);
        // 将 Map 放进 过滤器的工厂类中
        factoryBean.setFilterChainDefinitionMap(filerMap);
        return factoryBean;
    }


    // 将安全管理器 SecurityManager 放入spring容器
    // 控制翻转
    @Bean
    public DefaultWebSecurityManager defaultWebSecurityManager(@Autowired LoginRealm loginRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 关联 自定义的 realm 类
        securityManager.setRealm(loginRealm);
        return securityManager;
    }

    @Bean
    public LoginRealm loginRealm(@Autowired HashedCredentialsMatcher hashedCredentialsMatcher){
        LoginRealm realm = new LoginRealm();
        // 将加密方式关联我们自定义的 realm 类
        realm.setCredentialsMatcher(hashedCredentialsMatcher);
        return realm;
    }

    // 设置密码加密
    @Bean
    public HashedCredentialsMatcher hashedCredentialsMatcher(){
        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
        // 指定加密的方式
        matcher.setHashAlgorithmName("MD5");
        // 设置加密次数
        matcher.setHashIterations(3);
        // 是否使用设置编码
        matcher.setStoredCredentialsHexEncoded(true);
        return matcher;
    }
}
